Readline தொகுதிக்கு அறிமுகம்
Readline தொகுதி ஒரு முக்கிய Node.js தொகுதியாகும், இது ஒரு வாசிக்கக்கூடிய ஸ்ட்ரீமில் இருந்து (process.stdin போன்றவை) ஒரு நேரத்தில் ஒரு வரியாக தரவைப் படிக்க ஒரு இடைமுகத்தை வழங்குகிறது.
இது குறிப்பாக பயனுள்ளமானது:
ஊடாடும் கட்டளை வரி பயன்பாடுகள்
பயனர்களுடன் ஊடாடும் CLI பயன்பாடுகள் உருவாக்குதல்
கட்டமைப்பு வழிகாட்டிகள்
அமைப்பு வழிகாட்டிகள் மற்றும் அமைக்கும் கருவிகள்
கட்டளை வரி விளையாட்டுகள்
உரை அடிப்படையிலான விளையாட்டுகள் மற்றும் பயன்பாடுகள்
பொதுவான பயன்பாட்டு நிகழ்வுகள்
- ஊடாடும் கட்டளை வரி பயன்பாடுகள்
- கட்டமைப்பு வழிகாட்டிகள் மற்றும் அமைக்கும் கருவிகள்
- கட்டளை வரி விளையாட்டுகள்
- REPL (Read-Eval-Print Loop) சூழல்கள்
- பெரிய உரை கோப்புகளை வரி வரியாக செயலாக்குதல்
- தனிப்பயன் ஷெல்கள் மற்றும் CLIகளை உருவாக்குதல்
முக்கிய அம்சங்கள்
- வரி-வரியாக உள்ளீட்டு செயலாக்கம்
- தனிப்பயன் ப்ராம்ப்ட்கள் மற்றும் வடிவமைப்பு
- டேப் முடிவு ஆதரவு
- வரலாறு மேலாண்மை
- நிகழ்வு-இயக்கப்பட்ட இடைமுகம்
- வாக்குறுதி-அடிப்படையிலான API ஆதரவு
குறிப்பு:
Readline தொகுதி Node.js இல் உள்ளமைக்கப்பட்டுள்ளது, எனவே கூடுதல் நிறுவல் தேவையில்லை.
கட்டளை வரி மூலம் பயனர்களுடன் ஊடாட வேண்டிய அல்லது உரை உள்ளீட்டை வரி-சார்ந்த வழியில் செயலாக்க வேண்டிய எந்தவொரு பயன்பாட்டிற்கும் இது சிறந்தது.
Readline உடன் தொடங்குதல்
Readline தொகுதியைப் பயன்படுத்தி ஒரு எளிய ஊடாடும் கட்டளை வரி பயன்பாட்டை உருவாக்குவதற்கான விரைவான எடுத்துக்காட்டு இங்கே:
அடிப்படை ஊடாடும் ப்ராம்ப்ட்
const readline = require('readline');
// உள்ளீடு/வெளியீட்டிற்கான இடைமுகத்தை உருவாக்கவும்
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
// ஒரு கேள்வியைக் கேட்டு பதிலைக் கையாளவும்
rl.question('What is your name? ', (name) => {
console.log(`Hello, ${name}!`);
// தொடர்ந்து கேள்வி கேட்கவும்
rl.question('How old are you? ', (age) => {
console.log(`In 5 years, you'll be ${parseInt(age) + 5} years old.`);
// முடிந்ததும் இடைமுகத்தை மூடவும்
rl.close();
});
});
// பயன்பாட்டு வெளியேற்றத்தைக் கையாளவும்
rl.on('close', () => {
console.log('Goodbye!');
process.exit(0);
});
இறக்குமதி மற்றும் அமைப்பு
Readline தொகுதியை உங்கள் தொகுதி அமைப்பு மற்றும் தேவைகளைப் பொறுத்து பல்வேறு வழிகளில் இறக்குமதி செய்யலாம்:
CommonJS (Node.js இயல்புநிலை)
// அடிப்படை require
const readline = require('readline');
// குறிப்பிட்ட முறைகளை டீஸ்ட்ரக்சரிங் பயன்படுத்தி இறக்குமதி செய்யவும்
const { createInterface } = require('readline');
// இயல்புநிலை அமைப்புகளுடன் இடைமுகத்தை உருவாக்கவும்
const rl = createInterface({
input: process.stdin,
output: process.stdout
});
ES தொகுதிகள் (Node.js 12+)
// இயல்புநிலை இறக்குமதியைப் பயன்படுத்துதல்
import readline from 'readline';
// பெயரிடப்பட்ட இறக்குமதிகளைப் பயன்படுத்துதல்
import { createInterface } from 'readline';
// டைனமிக் இறக்குமதி (Node.js 14+)
const { createInterface } = await import('readline');
// இடைமுகத்தை உருவாக்கவும்
const rl = createInterface({
input: process.stdin,
output: process.stdout
});
சிறந்த நடைமுறை:
நீங்கள் அதனுடன் முடிந்ததும் rl.close() ஐப் பயன்படுத்தி readline இடைமுகத்தை எப்போதும் மூடவும், இது கணினி வளங்களை விடுவிக்கவும் உங்கள் நிரலை சுத்தமாக வெளியேற அனுமதிக்கவும் உதவுகிறது.
Readline இடைமுகத்தை உருவாக்குதல்
createInterface முறை ஒரு readline இடைமுகத்தை உருவாக்குவதற்கான முக்கிய வழியாகும். இது பல கட்டமைப்பு பண்புகளைக் கொண்ட ஒரு விருப்பங்கள் பொருளை எடுக்கும்:
அடிப்படை இடைமுக உருவாக்கம்
const readline = require('readline');
// ஒரு அடிப்படை இடைமுகத்தை உருவாக்கவும்
const rl = readline.createInterface({
input: process.stdin, // கேட்க வேண்டிய வாசிக்கக்கூடிய ஸ்ட்ரீம்
output: process.stdout, // எழுத வேண்டிய எழுதக்கூடிய ஸ்ட்ரீம்
prompt: '> ', // பயன்படுத்த வேண்டிய ப்ராம்ப்ட் சரம் (இயல்புநிலை: '> ')
});
பொதுவான விருப்பங்கள்:
- input: கேட்க வேண்டிய வாசிக்கக்கூடிய ஸ்ட்ரீம் (இயல்புநிலை: process.stdin)
- output: எழுத வேண்டிய எழுதக்கூடிய ஸ்ட்ரீம் (இயல்புநிலை: process.stdout)
- prompt: பயன்படுத்த வேண்டிய ப்ராம்ப்ட் சரம் (இயல்புநிலை: '> ')
- terminal: true எனில், வெளியீட்டை TTY ஆக கருதுகிறது (இயல்புநிலை: output.isTTY)
- historySize: வரலாறு உள்ளீடுகளின் அதிகபட்ச எண்ணிக்கை (இயல்புநிலை: 30)
- removeHistoryDuplicates: true எனில், நகல் வரலாறு உள்ளீடுகளை அகற்றுகிறது (இயல்புநிலை: false)
- completer: டேப் தானியங்கி-முடிவுக்கான விருப்ப செயல்பாடு
- crlfDelay: CR மற்றும் LF க்கு இடையேயான தாமதம் (இயல்புநிலை: 100ms)
- escapeCodeTimeout: எழுத்து எஸ்கேப் வரிசைகளுக்காக காத்திருக்க வேண்டிய நேரம் (இயல்புநிலை: 500ms)
மேம்பட்ட இடைமுக எடுத்துக்காட்டு
const readline = require('readline');
const fs = require('fs');
// மேம்பட்ட விருப்பங்களுடன் ஒரு இடைமுகத்தை உருவாக்கவும்
const rl = readline.createInterface({
input: fs.createReadStream('input.txt'), // கோப்பில் இருந்து படிக்கவும்
output: process.stdout, // கன்சோலில் எழுதவும்
terminal: false, // உள்ளீடு ஒரு டெர்மினல் அல்ல
historySize: 100, // பெரிய வரலாறு
removeHistoryDuplicates: true, // நகல் கட்டளைகளை சேமிக்க வேண்டாம்
prompt: 'CLI> ', // தனிப்பயன் ப்ராம்ப்ட்
crlfDelay: Infinity, // அனைத்து CR/LF களையும் ஒற்றை வரி முறிவாக கையாளவும்
escapeCodeTimeout: 200 // வேகமான எஸ்கேப் குறியீட்டு கண்டறிதல்
});
// கோப்பிலிருந்து ஒவ்வொரு வரியையும் கையாளவும்
rl.on('line', (line) => {
console.log(`Processing: ${line}`);
});
// கோப்பின் முடிவை கையாளவும்
rl.on('close', () => {
console.log('Finished processing file');
});
குறிப்பு:
கோப்பு செயலாக்கத்திற்கான இடைமுகங்களை உருவாக்கும் போது, TTY-குறிப்பிட்ட அம்சங்களை முடக்கவும் மற்றும் செயல்திறனை மேம்படுத்தவும் terminal: false என அமைக்கவும்.
அடிப்படை Readline முறைகள்
Readline தொகுதி பயனருடன் ஊடாட பல முறைகளை வழங்குகிறது. இங்கே அடிக்கடி பயன்படுத்தப்படும் சில முறைகள் உள்ளன:
1. rl.question(query, callback)
பயனருக்கு ஒரு வினவலைக் காட்டுகிறது மற்றும் பயனரின் பதிலுடன் கால்பேக்கை அழைக்கிறது. எளிய பயனர் தொடர்புகளுக்கு இது அடிக்கடி பயன்படுத்தப்படும் முறைகளில் ஒன்றாகும்.
அடிப்படை எடுத்துக்காட்டு
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('What is your name? ', (name) => {
console.log(`Hello, ${name}!`);
rl.close();
});
கூடு கேள்விகள் எடுத்துக்காட்டு
function askQuestion(query) {
return new Promise(resolve => {
rl.question(query, resolve);
});
}
async function userSurvey() {
try {
const name = await askQuestion('What is your name? ');
const age = await askQuestion('How old are you? ');
const email = await askQuestion('What is your email? ');
console.log('\n=== User Information ===');
console.log(`Name: ${name}`);
console.log(`Age: ${age}`);
console.log(`Email: ${email}`);
} catch (error) {
console.error('An error occurred:', error);
} finally {
rl.close();
}
}
userSurvey();
rl.question()க்கான சிறந்த நடைமுறைகள்:
- கால்பேக் செயல்பாட்டில் எப்போதும் பிழைகளைக் கையாளவும்
- பல கேள்விகளுக்கு சிறந்த ஃப்ளோ கண்ட்ரோலுக்கு வாக்குறுதிகள் அல்லது async/await ஐப் பயன்படுத்தவும்
- செயலாக்குவதற்கு முன் பயனர் உள்ளீட்டை சரிபார்க்கவும்
- வளங்களை விடுவிக்க முடிந்ததும் இடைமுகத்தை எப்போதும் மூடவும்
2. rl.prompt([preserveCursor])
தற்போதைய ப்ராம்ப்ட்டை வெளியீட்டிற்கு எழுதுகிறது மற்றும் பயனர் உள்ளீட்டிற்காக காத்திருக்கிறது. விருப்பமான preserveCursor அளவுரு (பூலியன்) கர்சர் நிலை பாதுகாக்கப்பட வேண்டுமா என்பதை தீர்மானிக்கிறது.
அடிப்படை ப்ராம்ப்ட் எடுத்துக்காட்டு
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
prompt: 'CLI> '
});
// ஆரம்ப ப்ராம்ப்ட்டைக் காட்டவும்
rl.prompt();
// உள்ளீட்டின் ஒவ்வொரு வரியையும் கையாளவும்
rl.on('line', (line) => {
const input = line.trim();
switch (input) {
case 'hello':
console.log('Hello there!');
break;
case 'time':
console.log(`Current time: ${new Date().toLocaleTimeString()}`);
break;
case 'exit':
rl.close();
return;
default:
console.log(`You entered: ${input}`);
}
// ப்ராம்ப்ட்டை மீண்டும் காட்டவும்
rl.prompt();
});
// பயன்பாட்டு வெளியேற்றத்தைக் கையாளவும்
rl.on('close', () => {
console.log('Goodbye!');
process.exit(0);
});
ப்ராம்ப்ட்களைப் பயன்படுத்துவதற்கான உதவிக்குறிப்புகள்:
- ப்ராம்ப்ட் சரத்தை மாற்ற rl.setPrompt() ஐப் பயன்படுத்தவும்
- பல-வரி ப்ராம்ப்ட்களுக்கு, ப்ராம்ப்ட் சரத்தில் வரி முறிவுகளைச் சேர்க்கவும்
- உங்கள் ப்ராம்ப்ட்களுக்கு வண்ணங்களைச் சேர்க்க chalk போன்ற நூலகத்தைப் பயன்படுத்தவும்
- ஒவ்வொரு உள்ளீட்டையும் கையாள்ந்த பிறகு ப்ராம்ப்ட்டை மீண்டும் காட்ட rl.prompt() ஐ அழைக்க நினைவில் கொள்ளவும்
3. rl.write(data[, key])
தரவை வெளியீட்டு ஸ்ட்ரீமுக்கு எழுதுகிறது. விசை அழுத்தங்களை உருவகப்படுத்த விருப்பமான key அளவுருவைப் பயன்படுத்தலாம்.
எழுது எடுத்துக்காட்டு
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
// ஒரு வரவேற்பு செய்தியைக் காட்டவும்
rl.write('Welcome to the CLI Application!\n');
rl.write('='.repeat(30) + '\n\n');
// ஒரு இயல்புநிலை மதிப்பை முன்நிரப்பவும்
rl.question('Enter your username: ', (username) => {
console.log(`Hello, ${username}!`);
// ஒரு இயல்புநிலை மதிப்பை தட்டச்சு செய்ய உருவகப்படுத்தவும்
rl.write('default@example.com');
// வரியின் தொடக்கத்திற்கு கர்சரை நகர்த்தவும்
rl.write(null, { ctrl: true, name: 'a' });
rl.question('Enter your email: ', (email) => {
console.log(`Your email is: ${email}`);
rl.close();
});
});
rl.write()க்கான பொதுவான பயன்பாட்டு நிகழ்வுகள்:
- தலைப்புகள் அல்லது பிரிவு தலைப்புகளைக் காட்டுதல்
- ப்ராம்ப்ட்களில் இயல்புநிலை மதிப்புகளை வழங்குதல்
- சோதனைக்காக பயனர் உள்ளீட்டை உருவகப்படுத்துதல்
- தனிப்பயன் உள்ளீட்டு வடிவமைப்பை உருவாக்குதல்
4. rl.close()
readline இடைமுகத்தை மூடுகிறது மற்றும் உள்ளீடு மற்றும் வெளியீட்டு ஸ்ட்ரீம்களின் கட்டுப்பாட்டை விடுவிக்கிறது. கணினி வளங்களை விடுவிக்கவும் உங்கள் நிரலை சுத்தமாக வெளியேற அனுமதிக்கவும் இது முக்கியமானது.
சரியான கிளின்-அப் எடுத்துக்காட்டு
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
// பயன்பாட்டு வெளியேற்றத்தைக் கையாளவும்
function exitApp() {
console.log('\nCleaning up resources...');
// தேவையான எந்தவொரு கிளின்-அப்பையும் செய்யவும்
// (எ.கா., தரவுத்தள இணைப்புகளை மூடுதல், பதிவுகளை எழுதுதல், முதலியன)
// readline இடைமுகத்தை மூடவும்
rl.close();
}
// Ctrl+C ஐக் கையாளவும்
rl.on('SIGINT', () => {
console.log('\nReceived SIGINT. Exiting...');
exitApp();
});
// இயல்பான வெளியேற்றத்தைக் கையாளவும்
rl.on('close', () => {
console.log('Goodbye!');
process.exit(0);
});
// பயன்பாட்டைத் தொடங்கவும்
console.log('Application started. Press Ctrl+C to exit.');
rl.prompt();
5. rl.pause() மற்றும் rl.resume()
இந்த முறைகள் உள்ளீட்டு ஸ்ட்ரீமை தற்காலிகமாக இடைநிறுத்தவும் மீண்டும் தொடரவும் உங்களை அனுமதிக்கின்றன, இது பயனர் உள்ளீட்டின் ஓட்டத்தை கட்டுப்படுத்த பயனுள்ளதாக இருக்கும்.
இடைநிறுத்து/தொடர் எடுத்துக்காட்டு
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
let isPaused = false;
console.log('Type "pause" to pause input, "resume" to continue, or "exit" to quit');
rl.on('line', (input) => {
const command = input.trim().toLowerCase();
switch (command) {
case 'pause':
if (!isPaused) {
console.log('Input paused. Type "resume" to continue...');
rl.pause();
isPaused = true;
}
break;
case 'resume':
if (isPaused) {
console.log('Resuming input...');
rl.resume();
rl.prompt();
isPaused = false;
}
break;
case 'exit':
console.log('Goodbye!');
rl.close();
return;
default:
if (!isPaused) {
console.log(`You entered: ${input}`);
rl.prompt();
}
}
});
rl.prompt();
இடைநிறுத்து/தொடர் பயன்படுத்த வேண்டிய போது:
- பயனர் உள்ளீட்டால் குறுக்கிடப்படக்கூடாது நீண்ட-இயக்கும் செயல்பாடுகளைச் செய்யும் போது
- சில செயல்பாடுகளின் போது பயனர் உள்ளீட்டை தற்காலிகமாக முடக்கும் போது
- நீண்ட வெளியீடுகளுக்கு ஒரு பேஜிங் பொறிமுறையை செயல்படுத்தும் போது
- உள்ளீட்டு செயலாக்கத்தை த்ரோட்டில் செய்ய வேண்டிய போது
முறைகள் சுருக்கம்
| முறை | விளக்கம் |
|---|---|
| rl.question(query, callback) | வினவலைக் காட்டுகிறது மற்றும் பயனர் உள்ளீட்டிற்காக காத்திருக்கிறது, பின்னர் பயனரின் பதிலுடன் கால்பேக்கை அழைக்கிறது |
| rl.prompt([preserveCursor]) | பயனர் உள்ளீட்டிற்காக கட்டமைக்கப்பட்ட ப்ராம்ப்ட்டைக் காட்டுகிறது |
| rl.write(data[, key]) | தரவை வெளியீட்டு ஸ்ட்ரீமுக்கு எழுதுகிறது, விசை-அழுத்த நிகழ்வுகளையும் உருவகப்படுத்த முடியும் |
| rl.close() | readline இடைமுகத்தை மூடுகிறது மற்றும் உள்ளீடு மற்றும் வெளியீட்டு ஸ்ட்ரீம்களின் கட்டுப்பாட்டை விடுவிக்கிறது |
| rl.pause() | readline உள்ளீட்டு ஸ்ட்ரீமை இடைநிறுத்துகிறது |
| rl.resume() | readline உள்ளீட்டு ஸ்ட்ரீமை மீண்டும் தொடர்கிறது |
Readline உடன் வாக்குறுதிகளைப் பயன்படுத்துதல்
Readline தொகுதியின் கால்பேக்-அடிப்படையிலான API மிகவும் நவீன, async/await நட்பு குறியீட்டிற்காக வாக்குறுதிகளில் போடப்படலாம்:
const readline = require('readline');
// இடைமுகத்தை உருவாக்கவும்
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
// வாக்குறுதி-அடிப்படையிலான கேள்வி செயல்பாடு
function askQuestion(query) {
return new Promise(resolve => {
rl.question(query, resolve);
});
}
// Readline உடன் async/await ஐப் பயன்படுத்துதல்
async function main() {
try {
const name = await askQuestion('What is your name? ');
console.log(`Hello, ${name}!`);
const age = await askQuestion('How old are you? ');
console.log(`In 5 years, you'll be ${parseInt(age) + 5} years old.`);
const location = await askQuestion('Where do you live? ');
console.log(`${location} is a great place!`);
console.log('Thank you for your answers!');
} catch (error) {
console.error('Error:', error);
} finally {
rl.close();
}
}
// முக்கிய செயல்பாட்டை இயக்கவும்
main();
ஒரு கோப்பை வரி வரியாகப் படித்தல்
ஊடாடும் உள்ளீட்டைத் தவிர, Readline தொகுதியும் கோப்புகளை வரி வரியாகப் படிக்க முடியும், இது பெரிய உரை கோப்புகளை திறம்பட செயலாக்க பயனுள்ளதாக இருக்கும்:
const fs = require('fs');
const readline = require('readline');
// கோப்பிற்கான ஒரு வாசிக்கக்கூடிய ஸ்ட்ரீமை உருவாக்கவும்
const fileStream = fs.createReadStream('example.txt');
// readline இடைமுகத்தை உருவாக்கவும்
const rl = readline.createInterface({
input: fileStream,
crlfDelay: Infinity // CR LF இன் அனைத்து நிகழ்வுகளையும் ஒற்றை வரி முறிவாக அங்கீகரிக்கவும்
});
// வரி எண்களுக்கான கவுண்டர்
let lineNumber = 0;
// கோப்பை வரி வரியாக செயலாக்கவும்
rl.on('line', (line) => {
lineNumber++;
console.log(`Line ${lineNumber}: ${line}`);
});
// கோப்பின் முடிவைக் கையாளவும்
rl.on('close', () => {
console.log(`Finished reading file with ${lineNumber} lines.`);
});
குறிப்பு:
இந்த அணுகுமுறை பெரிய கோப்புகளுக்கு நினைவகம்-திறன் மிக்கதாகும், ஏனெனில் இது முழு கோப்பையும் நினைவகத்தில் ஏற்றுவதற்குப் பதிலாக ஒரு நேரத்தில் ஒரு வரியை செயலாக்குகிறது.
டேப் முடிவு
டேப் முடிவு கட்டளை மற்றும் கோப்பு பாதை பரிந்துரைகளை வழங்குவதன் மூலம் பயனர் அனுபவத்தை மேம்படுத்துகிறது. Readline தொகுதி தனிப்பயன் முடிவு தர்க்கத்தை செயல்படுத்த உங்களை அனுமதிக்கிறது:
டேப் முடிவு எவ்வாறு செயல்படுகிறது:
- பயனர் Tab விசையை அழுத்துகிறார்
- Readline தற்போதைய வரி மற்றும் கர்சர் நிலையுடன் உங்கள் completer செயல்பாட்டை அழைக்கிறது
- உங்கள் செயல்பாடு முடிவு பரிந்துரைகளை வழங்குகிறது
- Readline முடிவுகளைக் காட்டுகிறது அல்லது ஒரே ஒரு பொருத்தம் இருந்தால் தானாகவே முடிக்கிறது
const readline = require('readline');
const fs = require('fs');
const path = require('path');
// தானியங்கு முடிவுக்கான கிடைக்கக்கூடிய கட்டளைகள்
const commands = ['help', 'exit', 'list', 'clear', 'info', 'version', 'history'];
// ஒரு completer செயல்பாட்டுடன் readline இடைமுகத்தை உருவாக்கவும்
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
prompt: 'myapp> ',
completer: function(line) {
// கட்டளை முடிவு
if (!line.includes(' ')) {
const hits = commands.filter(c => c.startsWith(line));
// எதுவும் பொருந்தவில்லை என்றால் அனைத்து முடிவுகளையும் காட்டவும்
return [hits.length ? hits : commands, line];
}
// கோப்பு பாதை முடிவு ("list " போன்ற கட்டளைகளுக்கு)
if (line.startsWith('list ')) {
const dir = line.split(' ')[1] || '.';
try {
let completions = fs.readdirSync(dir);
// அடைவுகளுக்கு பின்னால் சாய்வு கோட்டைச் சேர்க்கவும்
completions = completions.map(file => {
const fullPath = path.join(dir, file);
return fs.statSync(fullPath).isDirectory() ? file + '/' : file;
});
const hits = completions.filter(c => c.startsWith(line.split(' ')[1] || ''));
return [hits.length ? hits : completions, line.split(' ')[1] || ''];
} catch (err) {
return [[], line];
}
}
return [[], line];
}
});
// ப்ராம்ப்ட்டை அமைக்கவும்
rl.prompt();
// கட்டளைகளைக் கையாளவும்
rl.on('line', (line) => {
line = line.trim();
switch (true) {
case line === 'help':
console.log('Available commands:');
commands.forEach(cmd => console.log(` ${cmd}`));
break;
case line === 'exit':
console.log('Goodbye!');
rl.close();
return;
case line.startsWith('list'):
const dir = line.split(' ')[1] || '.';
try {
const files = fs.readdirSync(dir);
console.log(`Contents of ${dir}:`);
files.forEach(file => {
const stats = fs.statSync(path.join(dir, file));
console.log(` ${file}${stats.isDirectory() ? '/' : ''}`);
});
} catch (err) {
console.error(`Error listing directory: ${err.message}`);
}
break;
case line === 'clear':
console.clear();
break;
case line === 'info':
console.log('Node.js CLI Example');
console.log(`Version: 1.0.0`);
break;
case line === 'version':
console.log(`Node.js version: ${process.version}`);
break;
case line === 'history':
// குறிப்பு: இது கையேடாக வரலாற்றை சேமிக்க வேண்டும்
console.log('History feature not fully implemented.');
break;
case line === '':
// வெற்று வரிகளுக்கு எதுவும் செய்ய வேண்டாம்
break;
default:
console.log(`Unknown command: ${line}`);
console.log('Type "help" for available commands');
}
rl.prompt();
}).on('close', () => {
console.log('CLI terminated.');
process.exit(0);
});
// Ctrl+C ஐக் கையாளவும்
rl.on('SIGINT', () => {
rl.question('Are you sure you want to exit? (y/n) ', (answer) => {
if (answer.toLowerCase() === 'y') {
rl.close();
} else {
rl.prompt();
}
});
});
பல-வரி உள்ளீடு
Readline தொகுதி பல-வரி உள்ளீட்டைக் கையாளுவதில் சிறந்தது, இது உரை எடிட்டர்கள், குறியீடு எடிட்டர்கள் அல்லது பயனர்களிடமிருந்து பல வரிகளை சேகரிக்க வேண்டிய எந்தவொரு பயன்பாட்டிற்கும் சிறந்தது. இதை திறம்பட செயல்படுத்துவது எப்படி என்பது இங்கே:
பல-வரி உள்ளீட்டு உத்திகள்:
- முடிவு மார்க்கர்: உள்ளீட்டின் முடிவை சமிக்ஞை செய்ய ஒரு சிறப்பு வரிசையைப் பயன்படுத்தவும் (".end" போன்றவை)
- அடைப்புக்குறி பொருத்தம்: திறக்கப்பட்ட அனைத்து அடைப்புக்குறிகள்/அடைப்புக்குறிகளும் மூடப்பட்டிருக்கும் போது தானாகவே கண்டறியவும்
- அர்ப்பணிக்கப்பட்ட கட்டளை: பல-வரி உள்ளீட்டை சமர்ப்பிக்க ஒரு குறிப்பிட்ட கட்டளை வழங்கவும்
- டைம்அவுட்-அடிப்படையிலான: பயனர் தட்டச்சு செய்து முடித்ததைக் கண்டறிய ஒரு டைமரைப் பயன்படுத்தவும்
const readline = require('readline');
// இடைமுகத்தை உருவாக்கவும்
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
prompt: '> '
});
console.log('Enter your multi-line input. Type ".end" on a new line to finish:');
rl.prompt();
// வரிகளை சேமிக்கவும்
const lines = [];
// உள்ளீட்டைக் கையாளவும்
rl.on('line', (line) => {
// முடிவு கட்டளையைச் சரிபார்க்கவும்
if (line.trim() === '.end') {
console.log('\nYour complete input:');
console.log('-'.repeat(30));
console.log(lines.join('\n'));
console.log('-'.repeat(30));
// உள்ளீட்டை செயலாக்கவும் (எடுத்துக்காட்டு: சொற்களை எண்ணுங்கள்)
const text = lines.join(' ');
const wordCount = text.split(/\s+/).filter(Boolean).length;
const charCount = text.length;
console.log(`\nStatistics:`);
console.log(`Lines: ${lines.length}`);
console.log(`Words: ${wordCount}`);
console.log(`Characters: ${charCount}`);
rl.close();
return;
}
// சேகரிப்பில் வரியைச் சேர்க்கவும்
lines.push(line);
rl.prompt();
});
ஒரு எளிய REPL ஐ உருவாக்குதல்
ஒரு Read-Eval-Print Loop (REPL) என்பது பயனர் உள்ளீட்டைப் படிக்கும், மதிப்பீடு செய்யும் மற்றும் முடிவை அச்சிடும் ஒரு ஊடாடும் நிரலாக்க சூழலாகும்.
Readline தொகுதி தனிப்பயன் REPLகளை உருவாக்க சிறந்தது. உங்கள் சொந்த REPL ஐ உருவாக்குவதற்கான ஒரு விரிவான வழிகாட்டி இங்கே:
ஒரு REPL இன் முக்கிய கூறுகள்:
- படிக்கவும்: பயனர் உள்ளீட்டை வரி வரியாக ஏற்கவும்
- மதிப்பீடு: உள்ளீட்டை பாகுபடுத்தவும் மற்றும் மதிப்பீடு செய்யவும்
- அச்சிடு: முடிவு அல்லது எந்தவொரு வெளியீட்டையும் காட்டவும்
- லூப்: அடுத்த கட்டளையுக்கான உள்ளீட்டு ப்ராம்ப்ட்டிற்குத் திரும்பவும்
- சிறப்பு கட்டளைகள்: .help, .exit போன்ற கட்டளைகளைக் கையாளவும்
- பிழை கையாளுதல்: தொடரியல் பிழைகள் மற்றும் விதிவிலக்குகளை நேர்த்தியாக கையாளவும்
const readline = require('readline');
const vm = require('vm');
// இடைமுகத்தை உருவாக்கவும்
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
prompt: 'js> '
});
// குறியீட்டை மதிப்பிடுவதற்கான சூழலை உருவாக்கவும்
const context = vm.createContext({
console,
Number,
String,
Array,
Object,
// நீங்கள் கிடைக்க செய்ய விரும்பும் வேறு எந்த உலகளாவிய மாறிகளையும் சேர்க்கவும்
// உங்கள் சொந்த செயல்பாடுகளையும் சேர்க்கலாம்
add: (a, b) => a + b,
multiply: (a, b) => a * b
});
console.log('Simple JavaScript REPL (Press Ctrl+C to exit)');
console.log('Type JavaScript code and press Enter to evaluate');
// ப்ராம்ப்ட்டைக் காட்டவும்
rl.prompt();
// பல-வரி உள்ளீட்டைக் கண்காணிக்கவும்
let buffer = '';
// உள்ளீட்டைக் கையாளவும்
rl.on('line', (line) => {
// எங்கள் பஃப்பரில் வரியைச் சேர்க்கவும்
buffer += line;
try {
// குறியீட்டை மதிப்பிட முயற்சிக்கவும்
const result = vm.runInContext(buffer, context);
// முடிவைக் காட்டவும்
console.log('\x1b[33m%s\x1b[0m', '=> ' + result);
// வெற்றிகரமான மதிப்பீட்டிற்குப் பிறகு பஃப்பரை மீட்டமைக்கவும்
buffer = '';
} catch (error) {
// இது ஒரு தொடரியல் பிழை மற்றும் முழுமையற்ற உள்ளீட்டின் காரணமாக இருக்கலாம் என்றால்,
// உள்ளீட்டை சேகரிப்பதைத் தொடரவும்
if (error instanceof SyntaxError &&
error.message.includes('Unexpected end of input')) {
// பல-வரி பயன்முறையில் தொடரவும்
rl.setPrompt('... ');
} else {
// இது ஒரு உண்மையான பிழை, அதைக் காட்டவும் மற்றும் பஃப்பரை மீட்டமைக்கவும்
console.error('\x1b[31m%s\x1b[0m', 'Error: ' + error.message);
buffer = '';
rl.setPrompt('js> ');
}
}
rl.prompt();
});
// Ctrl+C ஐக் கையாளவும்
rl.on('SIGINT', () => {
if (buffer.length > 0) {
// நிலுவையில் உள்ள உள்ளீடு இருந்தால், அதை அழிக்கவும்
console.log('\nInput cleared');
buffer = '';
rl.setPrompt('js> ');
rl.prompt();
} else {
// இல்லையெனில் வெளியேறவும்
rl.question('\nAre you sure you want to exit? (y/n) ', (answer) => {
if (answer.toLowerCase() === 'y') {
console.log('Goodbye!');
rl.close();
} else {
rl.prompt();
}
});
}
});
rl.on('close', () => {
console.log('REPL closed');
process.exit(0);
});
சிறந்த நடைமுறைகள்
Readline மற்றும் பிற உள்ளீட்டு முறைகளின் ஒப்பீடு
| முறை | நன்மைகள் | தீமைகள் | சிறந்தது |
|---|---|---|---|
| Readline | வரி-வரியாக செயலாக்கம், ஊடாடும் உள்ளீடு, வரலாறு, முடிவு | சிக்கலான இடைமுகங்களுக்கு அதிக குறியீடு | CLIகள், ஊடாடும் ப்ராம்ப்ட்கள், REPLகள் |
| process.stdin | குறைந்த-நிலை கட்டுப்பாடு, கச்சா தரவு | பயன்படுத்த கடினமான, கையேடு பஃப்பரிங் | பைனரி உள்ளீடு, தனிப்பயன் நெறிமுறைகள் |
| Inquirer.js (3rd party) | பணக்கார UI, பல உள்ளீட்டு வகைகள், சரிபார்ப்பு | வெளிப்புற சார்பு | சிக்கலான படிவங்கள், கணக்கெடுப்புகள், கட்டமைப்பு வழிகாட்டிகள் |
| Commander.js (3rd party) | கட்டளை வரையறை, விருப்பம் பாகுபடுத்துதல் | குறைவாக ஊடாடும் | வாதங்கள் கொண்ட கட்டளை வரி கருவிகள் |
சுருக்கம்
Node.js Readline தொகுதி ஊடாடும் கட்டளை வரி இடைமுகங்களை உருவாக்க, உரை உள்ளீட்டை வரி வரியாக செயலாக்க மற்றும் பயனர் தொடர்பு தேவைப்படும் கருவிகளை உருவாக்க ஒரு எளிய ஆனால் சக்திவாய்ந்த வழியை வழங்குகிறது.
இது குறிப்பாக பயனுள்ளமானது:
ஊடாடும் கட்டளை ப்ராம்ப்ட்கள்
பயனர் உள்ளீட்டுடன் ஊடாடும் CLI பயன்பாடுகள்
கோப்பு செயலாக்கம்
கோப்புகளை வரி வரியாக செயலாக்குதல்
தனிப்பயன் REPL சூழல்கள்
நிகழ்நேர குறியீடு மதிப்பீட்டிற்கான சூழல்கள்
உரை-அடிப்படையிலான இடைமுகங்கள்
உரை அடிப்படையிலான விளையாட்டுகள் மற்றும் பயன்பாடுகள்
மேற்பரப்பில் எளிமையாக இருந்தாலும், Readline ஐ வாக்குறுதிகள், நிகழ்வு கையாளுதல் மற்றும் சரியான UX பரிசீலனைகளுடன் இணைப்பது ஒரு சிறந்த பயனர் அனுபவத்தை வழங்கும் அதிநவீன கட்டளை வரி பயன்பாடுகளை உருவாக்க உங்களை அனுமதிக்கிறது.